home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / SPEZIAL / GEMVIEW / VERSION.3 / MODLPROG.TXT next >
Encoding:
Text File  |  1993-11-05  |  101.5 KB  |  1,703 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.          ======================================================
  8.         |                                                      |
  9.         |    Programmierung von Modulen für GEM-View 3.00      |
  10.         |               ----------------------                 |
  11.         |               GEM-View ist SHAREWARE                 |
  12.         |               ----------------------                 |
  13.         |                                                      |
  14.         |                 © 1990/91/92/93 by                   |
  15.         |                                                      |
  16.         |                  Dieter Fiebelkorn                   |
  17.         |                   Grüner Weg  29a                    |
  18.         |                 45768 Marl-Brassert                  |
  19.         |                      (Germany)                       |
  20.         |                                                      |
  21.          ======================================================
  22.  
  23.  
  24.  
  25.  
  26.  
  27. !!!!! BITTE LESEN SIE AUCH DIE DATEIEN "CHANGES" UND "GEMVIEW3.TXT" !!!!!
  28.  
  29.  
  30.  
  31. Inhaltsübersicht: (Lesen Sie auch "CHANGES")
  32. ============================================
  33.   - Modularisierung
  34.     - Allgemeines
  35.     - Lademodule
  36.       - GDPS Treiber
  37.     - Speichermodule
  38.     - Druckmodule
  39.     - Bearbeitungsmodule
  40.     - Das Konvertierungsmodul
  41.     - "EXTOBFIX.PRG" von Interface
  42.     - Abschließende Worte
  43.   - Parameterübergabe und allgemeine Strukturen
  44.     - Parameterübergabe
  45.     - IMAGE-Struktur
  46.     - IMAGEOPTIONS-Struktur
  47.     - LOAD-Struktur
  48.     - SAVE-Struktur
  49.     - PRINT-Struktur
  50.     - PROC-Struktur
  51.     - CONV-Struktur
  52.   - Entwickler-Support
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59. Neue Modularisierung:
  60. """""""""""""""""""""
  61.  
  62. Allgemeines:
  63. ¯¯¯¯¯¯¯¯¯¯¯¯
  64.  Die externen Module haben die Endungen: GVL, GVS, GVP und GVR (jeweils
  65.  für Load, Save, Print unf pRocess) und werden in einem einstellbaren
  66.  Modulverzeichnis ("Install path ...   ^Z") in den Unterordern GVWLOAD,
  67.  GVWSAVE, GVWPRINT und GVWMODUL gesucht! Von diesem Modulen darf es
  68.  beliebig viele geben; Hauptsache es ist genug Speicher vorhanden um die
  69.  allgemeinen Verwaltungsinformationen zu allen Modulen anzulegen. Aber
  70.  wenn das nicht klappt, dann sollten Sie besser keine Bilder mehr laden,
  71.  dafür reicht der Speicher dann mit Sicherheit nicht mehr! Allerdings
  72.  bleibt GEM-View mit seinen internen Modulen (GEM-XIMG, GEM-Metafile, Text,
  73.  Resourcen und Hexdump fürs Laden, sowie GEM-XIMG fürs Speichern) funktions-
  74.  tüchtig!
  75.  
  76.  Auch wenn "verbose" eingeschaltet ist sollte nicht mehr als notwendig
  77.  "gelabert" werden. Eine einzeilige Information über die Aktion ist
  78.  vollkommen ausreichend. Wenn jemand sein Copyright unbedingt einbringen
  79.  muß, dann ist die Meldung auf eine Zeile zu beschränken und darf nur
  80.  bei dem Speicher-, Druck- und Bearbeitungsmodulen eingebaut werden.
  81.  Bei den Lademodulen ist es nur störend und wird ohne meine Zustimmung
  82.  nicht geduldet. Im äußersten Fall ;-{ kann ich mich dazu durchringen
  83.  es bei einem komplexen Modul NACH der Identifizierung des Bildes zu
  84.  erlauben!
  85.  
  86.  Für das Copyright ist der Modulheader und die Infofunktion in den
  87.  "Load type"-, Speicher-, Druck- und Bearbeitungs-Dialogen geschaffen
  88.  worden!
  89.  Da Beispiele meist mehr sagen als viele Worte, liegen eine Reihe von
  90.  Sourcen für die einzelnen Modulen dem Paket bei! Allerdings finden
  91.  sich hier doch einige Anmerkungen und Hinweise, die in den Sourcen
  92.  und in der Beschreibung der Strukturen nicht so offensichtlich zu
  93.  Tage treten.
  94.  
  95.  
  96.  
  97. Lademodule:
  98. ¯¯¯¯¯¯¯¯¯¯¯
  99. Folgende Bildtypen dürfen von dem Ladetreiber geliefert werden:
  100. - Mono      : IATARIMONO, IBITMAP
  101. - Color     : IATARI_RGB, IRGB
  102. - True-Color: IATARI__TC, ITRUEC
  103.  
  104. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  105. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  106. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  107. im Register D0 übergeben wird:
  108.  
  109.   Image *gvw_loader(LOAD_Structure*  ls, int verbose);
  110.  
  111. Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
  112. zurückgegeben. Neben dem Zeiger auf die Struktur sind zwei Sonder-
  113. fälle möglich:
  114. "NULL" oder "0L" im Register A0 bedeutet, daß kein Bild identifiziert
  115.                  oder geladen wurde!
  116. "(Image* -1L)"   im Register A0 bedeutet, daß das Bild zwar eindeutig
  117.                  identifiziert werden konnte, aber es war aber nicht
  118.                  möglich es zu laden (Speicherplatzmangel, defekte
  119.                  Bilddaten, ...)Alle anderen Werte werden als Zeiger auf eine "Image"-Struktur ver-
  120. wendet. Also, hier ist Gewissenhaftigkeit angesagt!
  121.  
  122. Lademodule müssen, wenn Sie automatisch von GEM-View aufgerufen werden
  123. zuerst versuchen das Format des Bildes zu identifizieren, d.h. prüfen,
  124. ob das angegebene File eindeutige Merkmale des Formates besitzt, das
  125. dieses Modul repräsentiert. Ein automatischer Aufruf kann von dem
  126. benutzer-gewählten Aufruf durch das Flag "ls->user_identified" unter-
  127. schieden werden. Soll das Format nur identifiziert, aber nicht geladen,
  128. werden, so ist das Flag "ls->only_identified" gesetzt. In diesem Fall
  129. wird, wie beim Laden, eine Meldung über das Bild ausgegeben, wenn das
  130. Bild identifiziert werden konnte und ein Wert ungleich NULL ((void*)0L)
  131. in A0 zurückgegeben. Konnte das Bild nicht identifiziert werden, so
  132. wird als Funktionswert NULL ((void*)0L) in A0 zurückgegeben.
  133.  
  134. Bei den Lademodulen kann über "Schalter" (Flags) die Verwaltung und
  135. Verwendung der Module gesteuert werden. Weiterhin existiert ein Flag,
  136. welches nur vom Programmierer des Moduls eingestellt werden kann:
  137. Das "File-Selector"-Flag.
  138.  
  139. Der Schalter "Res." (Resistent) bewirkt im eingeschalteten Zustand, daß
  140. dieses Modul dauerhaft, d.h. während der Laufzeit von GEM-View, im
  141. Hauptspeicher gehalten wird. Ist dieser Schalter im Modul eingeschaltet,
  142. wenn GEM-View gestartet wird, so wird das Modul während des "Scan" oder
  143. Absuchvorganges geladen und im Speicher verwaltet. Wird der Schalter
  144. erst nach dem Start von GEM-View aktiviert, so wird das Modul resistent
  145. nachdem es einmalig zur Analyse des Bildformates in den Speicher ge-
  146. laden worden ist.
  147.  
  148. Der Schalter "Auto" (Automatischer Aufruf) wird dazu verwendet GEM-View
  149. mitzuteilen, ob dieses Modul zur Identifizierung des Bildformates ein-
  150. gesetzt werden soll. Eingeschaltet wird das Modul geladen und mit den
  151. dort vorhandenen Prüfmechanismen versucht das Bild zu analysieren, wird
  152. es erkannt, so wird es mit diesem Modul auch sofort geladen. Ist der
  153. Schalter nicht aktiviert, so wird das Modul einfach übersprungen, aller-
  154. dings können Sie es über "Load type" immer noch direkt auswählen!
  155.  
  156. Das "File-Selector"-Flag gibt an, ob eine File-Selector-Box zur
  157. Auswahl eines Bildes geöffnet werden soll in der Regel ist dies
  158. der Fall, wenn allerdings das Bild nicht einer Datei, sondern einem
  159. externen Gerät entnommen wird (z.B. Scanner) so ist die File-Selector-
  160. Box überflüssig und kann deaktiviert werden. Dies bietet sich gerade
  161. im Zusammenhang mit dem "Auto"-Flag an um beispielweise einen GDPS-
  162. Treiber für GEM-View zu realisieren.
  163.  
  164. Nebenbei empfehle ich zur Sicherheit, das Module, die externe Geräte
  165. ansprechen oder vor der Analyse des Bildes einen Benutzerdialog führen
  166. müssen in der Struktur "LOAD_Structure" das Flag "ls->user_identified"
  167. überprüft wird. Ist es gelöscht handelt es sich um einen automatischen
  168. Aufruf von GEM-View, so das häufig ein sofortiges Verlassen des Moduls
  169. sinnvoll sein dürfte. Ist das "ls->user_identified"-Flag hingegen ge-
  170. setzt kann das sich Modul voll ins Zeug legen, weil ... der Benutzer
  171. will es ja nicht besser! ;-/
  172.  
  173.   GDPS Treiber:
  174.   ¯¯¯¯¯¯¯¯¯¯¯¯¯
  175.   Dieser Abschnitt ist dazu da um Neugierig zu machen in den letzten
  176.   Absätzen sollte klar geworden sein, das ein GDPS-Treiber einfach an
  177.   GEM-View anzubinden sein sollte, wenn mal die GDPS-Schnittstellen-
  178.   Beschreibung vorliegt. Am besten ist aber ein Programmierer, der
  179.   sich schonmal damit rumgeschlagen hat macht sich daran zu schaffen.
  180.   Ich kann es nicht selber machen, da mir Beschreibung, Geräte zum
  181.   testen und inzwischen auch die Zeit fehlt. Tja, ;-(
  182.  
  183.  
  184.  
  185. Speichermodule:
  186. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  187. Folgende Bildtypen können dem Speichermodul übergeben werden:
  188. - Mono      : IATARIMONO, IBITMAP
  189. - Color     : IATARI_RGB, IRGB
  190. - True-Color: IATARI__TC, ITRUEC
  191.  
  192. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  193. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  194. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  195. im Register D0 übergeben wird:
  196.  
  197.   int    gvw_saver (SAVE_Structure*  ss, int verbose);
  198. Der Rückgabewert der Funktion, der angibt ob die Funktion korrekt
  199. ihren Dienst verrichtet hat wird im Register D0 erwartet.
  200.  
  201.  
  202.  
  203. Druckmodule:
  204. ¯¯¯¯¯¯¯¯¯¯¯¯
  205. Folgende Bildtypen können dem Druckmodul übergeben werden:
  206. - Mono      : IATARIMONO
  207. - Color     : IATARI_RGB
  208. - True-Color: IATARI__TC
  209.  
  210. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  211. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  212. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  213. im Register D0 übergeben wird:
  214.  
  215.   int    gvw_print (PRINT_Structure* ps, int verbose);
  216. Der Rückgabewert der Funktion, der angibt ob die Funktion korrekt
  217. ihren Dienst verrichtet hat wird im Register D0 erwartet.
  218.  
  219.  
  220.  
  221. Bearbeitungsmodule:
  222. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  223. Folgende Bildtypen können dem Bearbeitungsmodul übergeben werden:
  224. - Mono      : IATARIMONO
  225. - Color     : IATARI_RGB
  226. - True-Color: IATARI__TC
  227.  
  228. Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
  229. der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
  230. "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
  231. im Register D0 übergeben wird:
  232.  
  233.   Image *gvw_proc  (PROC_Structure*  rs, int verbose);
  234. Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
  235. zurückgegeben. Neben dem Zeiger auf die Struktur ist ein Sonder-
  236. fall möglich:
  237. "NULL" oder "0L" im Register A0 bedeutet, das die Operation nicht
  238.                  durchgeführt werden konnte. Der Grund sollte dem
  239.                  Benutzer durch eine Zeile im Protokoll-Fenster
  240.                  angezeigt werden. Alternativ kann in diesem Fall
  241.                  auch der Zeiger auf das "Input"-Bild "rs->image"
  242.                  zurückgegeben werden, es hat den gleichen Nährwert!
  243.  
  244. Das Bild, welches dem Bearbeitungsmodul übergeben wird von GEM-View aus dem
  245. Speicher entfernt und darf nicht vom Modul gelöscht werden.
  246.  
  247.  
  248.  
  249. Das Konvertierungsmodul:
  250. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  251.   Eine neue Funktion im Modul GEMVIEW.GVC wird durch "Convert ..." im  Deskmenü aufgerufen, wenn das Modul gefunden wird. Sie liefert eine
  252.   Kette von ImageOptions-Strukturen zurück, die dann von GEM-View ab-
  253.   gearbeitet wird. Der Zeiger auf die Struktur "CONV_Structure" wird
  254.   im Register A0 übergeben.
  255.   ImageOptions *gvw_proc  (CONV_Structure*  cs);
  256.  
  257. Der Zeiger auf die "ImageOptions"-Struktur wird ebenfalls im Register
  258. A0 erwartet. Neben dem Zeiger auf die Struktur ist ein Sonderfall
  259. möglich:
  260. "NULL" oder "0L" Nichts zu Konvertieren! (*Puh*) Nochmal an der an-
  261.                  strengenden Arbeit vorbei gekommen.
  262.  
  263. Die Hauptfunktion des Moduls "CONVERT", das auch als Quelltext vorliegt,
  264. hilft sicherlich beim Entwerfen eines neuen Konvertierungsmodule, welches
  265. nur noch die Strukturen zusammenstellen muß. GEM-View übernimmt ja die
  266. eigentliche Arbeit. Schauen Sie sich also mal ein wenig in der Funktion
  267. "gvw_convert" aus dem "CONVERT"-Modul um.
  268. Die anderen Funktionen im Modul "CONVERT" sind "schmückendes" Beiwerk und
  269. für die die Gesamtfunktionsweise von untergeordneter Bedeutung.
  270.  
  271.  
  272.  
  273. "EXTOBFIX.PRG" von Interface
  274. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  275.  
  276. Die Idee, für die Anzeige von erweiterten Resourcen, externe Module zu
  277. verwenden geht leider mal nicht auf mich zurück. Vielmehr hat Georg Krämer
  278. diesem Vorschlag Anfang Oktober gemacht, den ich gerne aufgegriffen habe,
  279. weil Olaf Meisiek (Autor von Interface) die meiste Arbeit mit seiner
  280. Definition und der Realisierng von "EXTOBFIX.PRG" schon geleistet hatte.
  281. Wäre ich nicht so blöd gewesen, hätte die Einbindung auch wesentlich
  282. schneller und unproblematischer ablaufen können. Na ja, reden wir besser
  283. nicht darüber.
  284. Also langer Rede kurzer Sinn, wenn Sie ihr persönliches "EXTOBFIX.PRG" in
  285. den Modulordner kopieren dann werden die Resourcen nun in voller Pracht
  286. und Schönheit angezeigt. Für alle Wissensdurstigen sei gesagt: GEM-View
  287. verwendet ausschließlich die "fix_objs"-Routine aus dem Zeigerarray und
  288. legt wie Interface Kopien der aller OBJECT-Strukturen an (Edit-Objekte
  289. gibt es in GEM-View nicht ;-). Für weitere Informationen schlagen Sie
  290. bitte im Interface-Handbuch unter "Programmierung eines EXTOBFIX-Programmes"
  291. nach (bei mir ist es Kapitel 7, Seite 63).
  292.  
  293.  
  294.  
  295. Abschließende Worte:
  296. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  297. Speichermodule schreiben ihre Ausgaben in eine Datei, eine Umlenkung
  298. auf den Drucker wird nicht speziell unterstützt, dafür ist es aber
  299. möglich sowohl Farbbilder, als auch TrueColor-Bilder in einer mono-
  300. chromen Bildschirmauflösung zu erhalten.
  301. Die Druckmodule geben in der Regel die Daten direkt auf den Drucker
  302. aus. Hierfür stehen "PRN:" für die parallele Schnittstelle und "AUX:"
  303. für die serielle Schnittstelle zur Verfügung. Eine Ausgabe in eine
  304. Datei kann ohne weiteres durch die Angabe eines absoluten Pfades
  305. erfolgen. Allerdings kann NUR das angezeigte Bild gedruckt werden.
  306.  
  307. Abfragen über Alert-Boxen oder mit Hilfe von Dialogen oder die Ver-
  308. wendung der File-Selector-Box sind zulässig. Als Beispiel sei angeführt:
  309. - JPEG Speichermodul (ist mir von Guido Vollbeding zugesichert worden!):
  310.   Kann mit einem Dialog die Qualität der Ausgabe einstellen.
  311. - PostScript Druckmodul (wird von Björn Tiemann (Schweiz) erstellt):
  312.   Kann mit einer Alert-Box abfragen, ob auf der paralellen, der seriellen
  313.   Schnittstelle oder in ein File "gedruckt" werden soll. Die File-Selector-
  314.   Box wird zur Auswahl der Zieldatei aufgerufen.
  315. Ich möchte allerdings darauf hinweisen, daß ein Modul seinem spezifischen
  316. Zweck nachkommen soll und nicht mehrere unterschiedliche Funktionen bereit-
  317. stellt. Es wird nur unübersichtlich, wenn das Speichermodul mit dem Drucker
  318. musiziert und vielleicht dann irgendwann ein Druckmodul versucht ein neues
  319. Bild zu Laden. Vieles ist möglich, aber nicht alles ist sinnvoll.
  320. Achtet also auf eine saubere Trennung der Module! DANKE!
  321.  
  322. Soll ein Modul erstellt werden, das in einer beliebigen Bildschirmauflösung,
  323. in der Lage sein soll, einen beliebigen Bildtyp wieder in voller Farbtiefe
  324. abzulegen, so sollte es konsequenterweise als Speichermodul ausgelegt
  325. werden. Im Beispiel einer PostScript Ausgabe sollte ein Modul für die
  326. Speicherung zuständig sein (dies verarbeitet alle möglichen Bildtypen,
  327. unabhängig von der Bildschirmauflösung). Ein weiteres Modul ist für den
  328. Druck zuständig und erhält ausschließlich angezeigte Bilder.
  329.  
  330. Die GEM-View Module dürfen "fast" alles, was ein GEM-Programm darf.
  331. Nicht erlaubt ist die Verwendung der Funktionen appl_init() und appl_exit()!
  332. Alles was nach Ende des Moduls nicht mehr erreichbar muß vor Ende des Moduls
  333. wieder entfernt werden. Zum Beispiel:
  334. - VDI-Workstation (auch virtuelle) müssen vor Beendigung des Moduls
  335.   geschlossen werden.
  336. - Fenster die erzeugt und geöffnet wurden müssen wieder geschlossen und
  337.   gelöscht werden.
  338. - Zu jedem wind_update(BEG_UPDATE/BEG_MCTRL) muß ein wind_update(END_UPDATE/
  339.   END_MCTRL) vorhanden sein.
  340. - ... (was sonst noch anfällt) ...
  341. CONVERT.C zeigt schon ein bissel (bischen) davon, was gemacht werden darf!
  342.  
  343. Nach einer Richtlinie von ATARI müssen Dialog durch wind_update(BEG_UPDATE/
  344. BEG_MCTRL) und wind_update(END_UPDATE/END_MCTRL) umschlossen werden, da es
  345. sonst zum "übermalen" des Dialoges durch den Desktop kommt (AES 3.x, 4.x)!
  346. CONVERT.C berücksichtigt diese Richtlinie!
  347.  
  348.  
  349.  
  350.  
  351.  
  352. Parameterübergabe und allgemeine Strukturen:
  353. """"""""""""""""""""""""""""""""""""""""""""
  354.  
  355. Parameterübergabe
  356. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  357. Für die Parameterübergabe gelten die Regeln von Turbo C / Pure C:
  358. Parameterübergabe Pure C (Auszug aus der Online Hilfe von PureC)
  359. ======================================================================
  360. - Die ersten drei Variablen vom Typ char, int oder long werden in den
  361.   Registern D0, D1, D2 übergeben.
  362. - Die ersten zwei Adressparameter (Pointer) werden in den Registern A0 und
  363.   A1 übergeben.
  364. - Weitere Parameter, die keinen Platz mehr in den Registern D0, D1, D2, A0
  365.   A1 finden werden über den Stack übergeben.
  366. - Parameter werden in der Reihenfolge von rechts nach links übergeben.
  367.  
  368. Beispiel:
  369. ---------
  370. extern void lbf(int x1, int y1, int x2, int y2, int *l, int *b, int *f);
  371. main()
  372. {
  373.     int x1 = 10, y1 = 10, x2 = 20, y2 = 20, l, b, f;
  374.     lbf(x1, y1, x2, y2, &l, &b, &f);
  375. }
  376. Da mehr Werte-, als auch Adress-Parameter an die Funktion "lbf" übergeben
  377. werden, als Register zur Verfügung stehen, benötigen wir also in jedem Fall
  378. den Stack. Der vierte Werte-Parameter muß auf dem Stack abgelegt werden.
  379. Ebenso findet der dritte Adress-Parameter keinen Platz in den Registern,
  380. so daß auch dieser auf dem Stack abgelegt werden muß.
  381.  
  382. In den Registern befinden sich:     D0: x1  (Wert von x1)
  383.                                     D1: y1  (Wert von y1)
  384.                                     D2: x2  (Wert von x2)
  385.                                     A0: &l  (Adresse der Variablen l)
  386.                                     A1: &b  (Adresse der Variablen b)
  387. Auf dem Stack befinden sich:        &f (hi) (höchstwertiges Wort im Stack)
  388.                                     &f (lo)
  389.                                     y2      (Wert von y2)
  390.                                     Return- (Rücksprungadresse)
  391.                                     Adresse (Stackpointer zeigt hierauf)
  392.  
  393. Der Adress-Parameter f wird nach der Regel "von-rechts-nach-links" zuerst
  394. auf den Stack gelegt. Danach kommt der Wert von y2 auf den Stack. Bitte
  395. beachten Sie, daß die Rücksprungadresse des Unterprogrammes als letzter
  396. "Parameter" auf den Stack gelegt wird, so daß die Parameter im Stack ab dem
  397. Offset 4 anfangen. y2 (Offset 4), &f (Offset 6)!
  398.  
  399. Übergabe von float und double Parametern (Wird hier nicht verwendet!)
  400. ---------------------------------------------------------------------
  401. - Variablen vom Typ "float" und "double" werden grundsätzlich auf dem
  402.   Stack übergeben.
  403. - Jede Funktion die eine andere Funktion mit Rückgabewert vom Typ "double"
  404.   oder "float" aufruft, reserviert als Erstes eine lokale "double"-Variable
  405.   (d.h. 10 Byte) auf dem Stack zur Aufnahme des Rückgabewertes.
  406. - Der Rückgabewert hat intern immer den Typ "double", auch wenn er als
  407.   "float" deklariert wurde. In diesem Fall wird er nach der Rückkehr in
  408.   einen "float" konvertiert.
  409.  
  410. Allgemeines
  411. -----------
  412. Obiges gilt sinngemäß auch für Funktionen, die Strukturen zurückliefern,
  413. nur werden nicht 10 Bytes auf dem Stack reserviert, sondern genügend
  414. Speicher, um die ganze Struktur aufzunehmem.
  415.  
  416. In C räumt die aufrufende Funktion nach dem Aufruf die Parameter selbst
  417. vom Stack (z.B. mit ADDQ.W #8,A7", nach einem Aufruf mit zwei Adresspara-
  418. metern). Dies erübrigt sich natürlich, wenn alle Parameter in Registern
  419. übergeben wurden.
  420. ======================================================================
  421.  
  422.  
  423.  
  424.  
  425.  
  426. IMAGE-Struktur (Zur Aufnahme und die Definition der Bilder)
  427. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  428. Hier ist die "Image"-Struktur, mit den Hilfsstrukturen aufgeführt und
  429. kurz erläutert.
  430.  
  431. typedef struct rgbmap {
  432.   unsigned int  size;         /* Größe der Farbpalette in red, green und blue,
  433.                                  muß unbedingt eine Zweierpotenz (2^n) sein */
  434.   unsigned int  used;         /* Anzahl der verwendeten Farben in Palette   */
  435.   unsigned char compressed;   /* (interne Verwendung) wird auf 0 gesetzt    */
  436.   unsigned char reserved;     /* (reserviert) für künftige Erweiterung      */
  437.   unsigned int  unused16;     /* (interne Verwendung) wird auf 0 gesetzt    */
  438.   Intensity    *red;          /* Farbwerte für Rot: Wertebereich [0..65535] */
  439.   Intensity    *green;        /* entsprechende Grün-Farbwerte von 0 bis used*/
  440.   Intensity    *blue;         /* dazu passende Farbwerte in Blau. Sum:Farbe */
  441. } RGBMap;
  442.  
  443.  
  444. typedef struct Scaling {
  445.   unsigned       count : 4;   /* ScaleDialog/Punkte: 1(a), 2(a,b), 3(a,b,c) */
  446.   unsigned       a     : 4;   /* Wertebereich: 1 (unterste Position)        */
  447.   unsigned       b     : 4;   /*               4 (mittlere Position,default)*/
  448.   unsigned       c     : 4;   /*               7 (oberste Position)         */
  449. } Scaling;
  450.  
  451.  
  452. typedef struct Image {
  453.   char          *title;       /* Pfadname, z.B. durch new...Image() gesetzt */
  454.   unsigned short type;        /* Typ des Bildes, durch new...Image() gesetzt
  455.                                 IBITMAP    0x11: Bild ist eine Bitplane
  456.                                 IATARIMONO 0x11: Bild ist Atari Mono Bitplane
  457.                                 IATARI_RGB 0x12: Bild ist AtariColor Bitmap
  458.                                 IATARI__TC 0x13: Bild ist Atari TrueColor
  459.                                 ITRUEC     0x13: Bild ist TrueColor Bild
  460.                                 IRGB       0x14: Bild ist RGB-Paletten Bild */
  461.   unsigned short width;       /* LOAD: sichtbare Breite des Bildes in Punkten
  462.                                  Nach dem Alignment (für SAVE, PRINT, PROC):
  463.                                  Gespeicherte Breite des Bildes in "data"   */
  464.   unsigned short height;      /* Höhe des Bildes in Punkten                 */
  465.   unsigned short depth;       /* Tiefe des Bildes, B/H/T gesetzt durch ...  */
  466.   unsigned short unalignwidth;/* (intern) sichbare Breite nach Alignment
  467.                               /* LOAD: nicht verwendet, auf 0 gesetzt.
  468.                               /* SAVE, PRINT, PROC: diese Breite beachten!  */
  469.   RGBMap         rgb;         /* Farbpalette des Bildes, Struktur siehe oben*/
  470.   byte          *data;        /* Bilddaten, gerundet nach den Angaben aus:
  471.                                  - "width" und "alignTo8" (bei LOAD)
  472.                                  - "width" (bei SAVE, PRINT, PROC, auf Worte)
  473.                                    wird durch Alignment auf Worte gerundet  */
  474.   unsigned int   pixlen;      /* Zahl der Bytes/Pixel: Mono/Color:1 ; TC:3  */
  475.   Scaling        scalered;    /* (intern) Scale-Beschreibung für Rot        */
  476.   Scaling        scalegreen;  /* (intern) Scale-Beschreibung für Grün       */
  477.   Scaling        scaleblue;   /* (intern) Scale-Beschreibung für Blau       */
  478.   Scaling        scaleadjust; /* (intern) Scale-Beschreibung f. Grauwandlung*/
  479.   unsigned       alignTo8 :2; /* 1: Bild ist schon auf Bytes aligned;
  480.                                     sollte in bei MONOs gesetzt werden
  481.                                  2: Bild steht schon Worte aligned in data  */
  482.   unsigned   fastload     :1; /* (internal)                                 */
  483.   unsigned   loadgdosfonts:1; /* (internal)                                 */
  484.   unsigned   scaleused    :1; /* (internal)                                 */
  485.   unsigned   unused       :3; /* (internal)                                 */
  486.   unsigned   font_point   :8; /* (internal)                                 */
  487. } Image;
  488.  
  489.  
  490. Folgende Bildtypen sind zulässig:
  491.  
  492. - Mono
  493.   - IATARIMONO, IBITMAP
  494.     In diesen Bildtypen wird eine Bitplane in "image->data" abgelegt. Ein
  495.     gesetztes Bit ist schwarz ein gelöschtes Bit ist weiß. Die Definition
  496.     entspricht einer GEM-Mono-Standard-Bitmap. Im Fall eines "IATARIMONO"-
  497.     Bildes sind die Daten auf 16 Bit (Worte) begradigt. Bei Bildern vom
  498.     Typ "IBITMAP" sind die Daten in der Regel byteweise ausgrichtet.
  499.  
  500. - Color
  501.   - IATARI_RGB
  502.     In "image->data" befindet sich eine GEM-Color-Standard-Bitmap, d.h. es
  503.     sind genau "image->depth" viele monochrome Bitplanes mit der folgenden
  504.     Größe hintereinander angeordnet: "image->width * image->height / 8".
  505.     Beachten Sie, daß "image->width" auf 16 begradigt ist und die Rechnung
  506.     in LONG durchgeführt werden sollte.
  507.     Die Reihenfolge der Farben ergibt sich aus der Kodierung der Pixel,
  508.     wobei die erste Plane das niederwertigste Bit repräsentiert.
  509.     Die Daten von Bilder des "IATARI_RGB"-Typs sind immer auf 16 Bit (Worte)
  510.     ausgerichtet! Beispiel: Ein Bild mit 3 Planes!
  511.     Plane 1: %01010101 ........
  512.     Plane 2: %00110011 ........
  513.     Plane 3: %00001111 ........
  514.     image->rgb.size = 8; image->used = 8
  515.     image->rgb.red  : 0xFFFF 0xFFFF 0x0000 0x0000 0xFFFF 0xFFFF 0x0000 0x0000
  516.     image->rgb.green: 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000
  517.     image->rgb.blue : 0xFFFF 0x0000 0x0000 0xFFFF 0x0000 0xFFFF 0xFFFF 0x0000
  518.     Die Punkte habe von links nach rechts folgende Kodierungen und Farben:
  519.     0(weiß), 1(rot), 2(grün), 3(blau), 4(gelb), 5(magenta), 6(cyan), 7(schwarz)
  520.   - IRGB
  521.     Das "IRGB"-Bildformat verwendet je ein Byte pro Bildpunkt und speichert 
  522.     dort direkt den Index auf die Farbpalette ab. Dabei wird unabhängig von
  523.     der Bildtiefe immer ein volles Byte verwendet. Das heißt, daß bei 16
  524.     Farben (Bildtiefe: 4) die obersten 4 Bit immer 0 sind!
  525.     Beispiel: wie oben!
  526.     "->data": 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
  527.     Die Kodierungen und die Farben entsprechen von links nach recht denen
  528.     des obigen Beispiels.
  529.  
  530. - True-Color
  531.   - IATARI__TC, ITRUEC
  532.     Vom Speicherumfang das größte Format. Hier werden pro Bildpunkt drei
  533.     hintereinanderliegende/unmittelbar-aufeinander-folgende Bytes verwendet,
  534.     dabei wird jeder Farbanteil (Rot, Grün, Blau) jeweils durch ein Byte
  535.     repräsentiert. Jeder Farbanteil hat somit einen Wertebereich von 0 bis
  536.     255, was genau dem True Color Format mit 16777216 Farben entspricht.
  537.     Die Reihenfolge der Farbanteile ist: Rot, Grün, Blau!
  538.     Im Fall eines "IATARI__TC"-Bildes sind die Daten auf 16 PIXEL ausge-
  539.     richtet. ACHTUNG: PIXEL = 3 Byte!
  540.  
  541.  
  542.  
  543.  
  544.  
  545. IMAGEOPTIONS-Struktur (zur Vorbereitung der automatischen Konvertierung)
  546. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  547. Die "ImageOptions"-Struktur wird ausschließlich von dem externen
  548. Konvertierungsmodul "GEMVIEW.GVC" verwendet.
  549.  
  550. typedef struct {
  551.   unsigned      tocolors      :16; /* # der Farben, Wertebereich [4 .. 256] */
  552.   unsigned      process       : 4; /* Typ des Bearbeitungsalgorithmus:
  553.                                       PROC_ORDER    0: Order-Dither Verfahren
  554.                                       PROC_NEAR     1: Benachtbarte Farbe
  555.                                       PROC_FLOYD    2: --"-- mit Fehlerfort.
  556.                                       PROC_JJN      3: --"-- mit Fehlerfort.
  557.                                       PROC_STUCKI   4: --"-- mit Fehlerfort.*/
  558.   unsigned      colormap      : 4; /* Typ der Farbpaletten-Berechnung:
  559.                                       CMAP_FIX      0: Feste  Farbpalette
  560.                                       CMAP_USERDEF1 1: Aus oberstem Fenster
  561.                                       CMAP_USERDEF2 2: Standardpalette
  562.                                       CMAP_OCTREEA  3: OcTree/Appromimativ
  563.                                       CMAP_OCTREE   4: OcTree/Alle Punkte
  564.                                       CMAP_STATA    5: Varianz/Appromimativ
  565.                                       CMAP_STAT     6: Varianz/Alle Punkte  */
  566.   unsigned      spec_active   : 1; /* aktiviert die eingestellten Werte     */
  567.   unsigned      spec_always   : 1; /* immer durchführen (also if no need)   */
  568.   unsigned      spec_grey     : 1; /* Dithering auf Grauwert-Palette        */
  569.   unsigned      spec_noise    : 1; /* Verwende "noise reduction"-Filter     */
  570.   unsigned      spec_compress : 1; /* Verdichte Palatte auf benutzte Farben */
  571.   unsigned      unused        : 3; /* (reserviert) für künftige Erweiterung */
  572. } ColorDither;
  573.  
  574.  
  575. typedef struct _ios{
  576.   char         *name;         /* Pfadname des zu ladenden Bildes            */
  577.   int           merged;       /* mit dem vorherigen Bild verschmelzen ?(0/1)*/
  578.   int           atx, aty;     /* Pos. an der das Bild einzufügen ist (merge)*/
  579.   unsigned int  bright;       /* Aufhellugsfaktor in Prozent, 100=0 default */
  580.   unsigned int  clipx, clipy; /* Obere linke Ecke des zu verwendenden Bildes*/
  581.   unsigned int  clipw, cliph; /* Ausdehnung des Zielbildes (Breite/Höhe)    */
  582.   unsigned int  last_clipx;   /* (interne Verwendung) wird auf 0 gesetzt    */
  583.   unsigned int  last_clipy;   /* (interne Verwendung) wird auf 0 gesetzt    */
  584.   unsigned int  last_clipw;   /* (interne Verwendung) wird auf 0 gesetzt    */
  585.   unsigned int  last_cliph;   /* (interne Verwendung) wird auf 0 gesetzt    */
  586.   unsigned int  dither;       /* Verfahren fürs s/w-Dither:
  587.                                 "Ausgeschltet" 0: Keine s/w Reduzierung
  588.                                  FS_Dither     1: "Floyd-Steinberg"-Verfahren
  589.                                  JJN_Dither    2: "Jarvis-Judice-Ninke" Algo
  590.                                  Stk_Dither    3: "Stucki"-Ditherverfahren
  591.                                  Halftone      4: Halbton mit 4x4-Raster
  592.                                  Ordereddither 5: Order-Dither (nachladbar) */
  593.   unsigned int  colors;       /* # Farben, fürs Zielbild (Farbvermelzung!)  */
  594.   int           rotate;          /* # Grad zu rotieren, muß Mehrfaches von 90  */
  595.   int           xzoom, yzoom; /* Vergrößerungsfaktor in Promille (1 zu 1000)
  596.                                  Positiv: Relativer Faktor in Promille
  597.                                  Negativ: Absolute Größe des Zielbildes     */
  598.   int           align;        /* (intern) für dem ATARI immer auf 16 gesetzt*/
  599.   int           save;         /* Speichere das Bild als:
  600.                                  1: Monochromes Bild; dither Bild wenn nötig
  601.                                  2: Farbbild; Farbquantisierung falls nötig 
  602.                                  3: True-Color-Bild                         */
  603.   char         *savename;     /* Pfadname des Zielbildes; Name zum speichern*/
  604.   int           autoname;     /* (interne Verwendung) auf 0 gesetzt         */
  605.   unsigned int  full,         /* Fülle Bild durch Vergrößern/Weiterholung   */
  606.                                  FULL_NO       0: Normal/Default
  607.                                  FULL_ZOOM     1: Füllen durch Vergrößern
  608.                                  FULL_REPEAT   2: Füllen durch Weiterholung */
  609.                 fullw, fullh; /* Ausdehnung (Breite/Höhe) des "Full"-Bildes */
  610.   ColorDither   colordither;  /* siehe Beschreibung der Struktur oben       */
  611.   Scaling       scalered;     /* siehe Beschreibung in IMAGE.H              */
  612.   Scaling       scalegreen;
  613.   Scaling       scaleblue;
  614.   Scaling       scaleadjust;
  615.   int           load_hexdump; /* Lade Datei immer als Text/Hexdump          */
  616.   struct _ios  *prev, *next;  /* doppelt verkettete Liste diese Struktur    */
  617.   char          tc_saver   [14]; /* Modulname ohne Pfad zum speichern (TC)  */
  618.   char          color_saver[14]; /* Modulname ohne Pfad zum speichern (col.)*/
  619.   char          mono_saver [14]; /* Modulname ohne Pfad zum speichern (mono)*/
  620. } ImageOptions;
  621.  
  622.  
  623.  
  624.  
  625.  
  626. LOAD-Struktur (für die externen Lade-Module von GEM-View3 *.GVL)
  627. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  628. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  629. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  630. Turbo C / Pure C. 
  631.  
  632. typedef struct LOAD_Structure {
  633.   long     identify;          /* GVWL_module  == 'GVWL' */
  634.   int      version;           /* GVWL_Version == 0x0100 */
  635.   char    *in_filename;       /* Pfadname der Datei, die geladen werden soll*/
  636.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  637.   int      identify_only;     /* Gesetzt: Nur Identifizieren/Mitteilung     */
  638.   int      user_identified;   /* Gelöscht: Automatischer Aufruf von GEM-View
  639.                                  Gesetzt : Vom Benutzer ausgewähltes Format */
  640.   struct {
  641.     ZFILE *(*open)            (char *name, int attrib);
  642.                               /* Öffnet virtuell die angegebene Datei, der
  643.                                  Wert von "attrib" ist auf 0 zu setzen.
  644.                                  Die Rückgabe ist ein Zeiger auf eine interne
  645.                                  Struktur, die mit FILE* vergleichbar ist.
  646.                                  Hinter dieser und den folgenden Funktionen
  647.                                  verbirgt sich eine effektive Pufferverwal-
  648.                                  tung. Nur beim ersten Aufruf wird die Datei
  649.                                  physikalisch geöffnet. Ein weiterer Aufruf
  650.                                  setzt nur einige Marke zurück, wenn beim
  651.                                  Lesen die Puffergrenze (Default: 8kB, in
  652.                                  GEMVIEW.INF änderbar) nicht überschritten
  653.                                  wird. Verwendet werden GEMDOS-Funktionen   */
  654.     ulong  (*read)            (ZFILE *zf, void *buf, ulong len);
  655.                               /* Ließt aus der geöffneten Datei, die durch
  656.                                  "zf" identifiziert wird, "len" viele Bytes
  657.                                  in den Buffer "buf". Die Funktion liefert
  658.                                  als Ergebnis die Zahl der gelesenen Zeichen*/
  659.     int    (*getchr)          (ZFILE *zf);
  660.                               /* Ließt ein Byte aus und gibt es als Wert
  661.                                  zurück. Im Fehlerfall wird "errno" auf
  662.                                  -1 gesetzt und EOF zurückgegeben.          */
  663.     char  *(*gets)            (void *buf, ulong len, ZFILE *zf);
  664.                               /* Ließt eine String bis zum ersten Auftreten
  665.                                  von '\n', dem Dateiende ein oder wenn "le"
  666.                                  viele Zeichen eingelesen wurde. Rückgabewert
  667.                                  ist ein Zeiger auf den Buffer oder NULL,
  668.                                  wenn kein Zeichen eingelesen wurde.        */
  669.     ulong  (*skip)            (ZFILE *zf, ulong len);
  670.                               /* Überspringt "len" viele Bytes. Die Funktion
  671.                                  liefert die neue Dateiposition als Ergebnis*/
  672.     ulong  (*seek)            (ZFILE *zf, int seekmode, ulong offset);
  673.                               /* Postitioniert die Schreibmarke neu. Mit
  674.                                  SEEK_SET (0) wird auf die absolute Position
  675.                                  "offset" positioniert. Bei SEEK_CUR (1) wird
  676.                                  die Position um "offset" Byte weitergesetzt.
  677.                                  SEEK_END (2) positioniert relativ vom Datei-
  678.                                  ende in Richtung Anfang der Datei.
  679.                                  Die Funktion liefert die neue Dateiposition
  680.                                  als Ergebnis                               */
  681.     ulong  (*tell)            (ZFILE *zf);
  682.                               /* Liefert als Wert die Länge der Datei.      */
  683.     int    (*eof)             (ZFILE *zf);
  684.                               /* Prüft die aktuelle Dateiposition darauf hin
  685.                                  ob das Dateiende überschritten wurde. Wert
  686.                                  0 zeigt einen Aufruffehler an. 1 weißt auf
  687.                                  Dateiende hin. Ansonsten wird -1 geliefert.*/
  688.     void   (*close)           (ZFILE *zf);
  689.                               /* Schließt die Datei virtuell. Die Datei wird
  690.                                  automatisch physikalisch geschlossen, wenn
  691.                                  eine Datei als Bild identifiziert und ge-
  692.                                  laden oder die Aktion abgebrochen wurde.   */
  693.   } input;
  694.   struct {
  695.     int    (*printout)        (const char* format, ...);
  696.                               /* Schreibt eine Meldung in das Protokollfenster
  697.                                  von GEM-View. Die Aufrufstruktur und die
  698.                                  Parameter entsprechen "printf()" aus der
  699.                                  C-Standard-Library.
  700.                                  Folgende Sonderzeichen wurden verarbeitet:
  701.                                  "\001" : Positioniere eine Zeile nach oben
  702.                                  "\002" : Positioniere eine Spalte nach links
  703.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  704.                                  "\034\001": Schalte auf Fett-Schrift
  705.                                  "\034\010": Schalte Unterstreichung ein
  706.                                  "\034\011": Fett und Unterstreichung ein
  707.                                  "\034\100": Auf Normalschrift schalten     */
  708.   } print;
  709.   struct {
  710.     void   (*printerr)        (const char* format, ...);
  711.                               /* Wie "printout" (siehe oben). Zusätzlich:
  712.                                  - Der Text wird "Fett" ausgegeben.
  713.                                  - Ist das Protokollfenster geschlossen, wird
  714.                                    eine Alert-Box geöffnet.
  715.                                  - Ist das Protokollfenster auf "klein" ge-
  716.                                    schaltet, so wird das Fenster auf "groß"
  717.                                    geschaltet und in den Vordergrund gebracht
  718.                                  - Ist das Protokollfenster auf "groß" ge-
  719.                                    schaltet, so wird das Fenster in den
  720.                                    Vordergrund gebracht                     */
  721.     void   (*userexit)        (void);
  722.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  723.                                  tritt, kann die das Modul sofort verlassen
  724.                                  werden. Aller angeforderter Speicher wird
  725.                                  zurückgegeben. Allerdings sind vorher alle
  726.                                  VDI-Worstations zu schließen und alle
  727.                                  wind_updates() abzuschießen ...
  728.                                  Sollte nur im schlimmsten Fall (und nur
  729.                                  dann) verwendet werden.                    */
  730.   } error;
  731.   struct {
  732.     byte  *(*malloc)          (ulong size);
  733.                               /* Reserviert "size" Bytes dynamischen Speicher.
  734.                                  Die Funktion verwaltet selbsttätig kleine
  735.                                  Speicherblöcke in größeren "Clustern", um
  736.                                  die Speicherfragmentierunggefahr etwas zu
  737.                                  veringern. Verwenden Sie nur diese Funktion
  738.                                  um Speicher dynamisch anzufordern.         */
  739.     void   (*free)            (void *area);
  740.                               /* Gibt den reservierten Speicher wieder frei.*/
  741.   } memory;
  742.   struct {
  743.     Image *(*newBitImage)     (char *title, unsigned int width, unsigned int height);
  744.                               /* Erzeugt und initialisiert eine "Image"-
  745.                                  Struktur, wobei der Pfadname oder NULL über
  746.                                  den Parameter "title" übergeben werden kann.
  747.                                  Für den Datenbreich wird eine Bitplane mit
  748.                                  alignwidth (auf 16 begradigtes "width") mal
  749.                                  "height" reserviert.
  750.                                  In "image->width" wird "width" eingetragen.
  751.                                  Achten Sie in jedem Fall darauf "image->
  752.                                  alignTo8" zu setzen.                       */
  753.     Image *(*newRGBImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  754.                               /* Erzeugt und initialisiert eine "Image"-
  755.                                  Struktur, wobei der Pfadname oder NULL über
  756.                                  den Parameter "title" übergeben werden kann.
  757.                                  Für den Datenbreich wird eine ein Speicher
  758.                                  mit alignwidth (auf 16 begradigtes "width")
  759.                                  mal "height" Bytes reserviert. "depth" ist
  760.                                  die Zahl der Bitebenen des Bildes für die
  761.                                  Brechnung der Größe der Farbpalette.
  762.                                  In "image->width" wird "width" eingetragen.
  763.                                  Achten Sie in jedem Fall darauf eventuell
  764.                                  "image->alignTo8" zu setzen.               */
  765.     Image *(*newTCImage)      (char *title, unsigned int width, unsigned int height);
  766.                               /* Erzeugt und initialisiert eine "Image"-
  767.                                  Struktur, wobei der Pfadname oder NULL über
  768.                                  den Parameter "title" übergeben werden kann.
  769.                                  Für den Datenbreich wird eine ein Speicher
  770.                                  mit alignwidth (auf 16 begradigtes "width")
  771.                                  mal "height" Tripel (RBG=3 Byte) reserviert.
  772.                                  In "image->width" wird "width" eingetragen.
  773.                                  Achten Sie in jedem Fall darauf eventuell
  774.                                  "image->alignTo8" zu setzen.               */
  775.     Image *(*newGEMImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  776.                               /* Erzeugt und initialisiert eine "Image"-
  777.                                  Struktur, wobei der Pfadname oder NULL über
  778.                                  den Parameter "title" übergeben werden kann.
  779.                                  Für den Datenbreich werden "depth" Bitplanes
  780.                                  mit alignwidth (auf 16 begradigtes "width")
  781.                                  mal "height" reserviert. Zur Aufnahme des
  782.                                  GEM-Standard-Formats. Das Bild ist IMMER
  783.                                  auf Worte begradigt zu Laden!              */
  784.     void   (*freeGVImage)     (Image *image);
  785.                               /* Gibt die reservierten Strukturen wieder frei,
  786.                                  wenn zum Beispiel des Bild während des Ladens
  787.                                  als defekt, fehlerhaft oder unvollständig
  788.                                  erkannt wird.                              */
  789.     Image *(*rotate)          (Image *image, int rotate);
  790.                               /* Dreht an Bild um 90, 180 oder 270 Grad, zum
  791.                                  Beispiel für Photo-CD-Bilder im Hochformat */
  792.   } images;
  793.   struct {
  794.     void   (*evntHandle)      (int wait);
  795.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  796.                                  eine Nachricht entgegenzunehmen und sie dann
  797.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  798.                                  keine Narchricht empfangen wird die Funktion
  799.                                  wieder verlassen. Sehr praktisch um GEM-View
  800.                                  ein paar Redraws und ähnliches machen zu
  801.                                  lassen.                                    */
  802.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  803.                               /* Verarbeitet ein Mausereignis, die Parameter
  804.                                  ev_mx, ev_my, keystate, keypress entsprechen
  805.                                  den Werten, die evnt_multi() liefert.
  806.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  807.                                  In exit wird ein Wert ungleich 0 zurückge-
  808.                                  geben, wenn das Modul seine Arbeit abbrechen
  809.                                  soll. Dieses sollte so schnell wie möglich
  810.                                  geschehen!                                 */
  811.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  812.                               /* Verarbeitet ein Tastaturereignis, die Para-
  813.                                  meter keystate, keypress entsprechen den
  814.                                  Werten, die evnt_multi() liefert.
  815.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  816.                                  In exit wird ein Wert ungleich 0 zurückge-
  817.                                  geben, wenn das Modul seine Arbeit abbrechen
  818.                                  soll. Dieses sollte so schnell wie möglich
  819.                                  geschehen!                                 */
  820.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  821.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  822.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  823.                                  keystate, keypress entsprechen den Werten,
  824.                                  die evnt_multi() liefert.
  825.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  826.                                  In exit wird ein Wert ungleich 0 zurückge-
  827.                                  geben, wenn das Modul seine Arbeit abbrechen
  828.                                  soll. Dieses sollte so schnell wie möglich
  829.                                  geschehen!                                 */
  830.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  831.                               /* Verarbeitet ein Messageereignis, die Para-
  832.                                  meter msg, ev_mx, ev_my, keystate, keypress
  833.                                  entsprechen den Werten, die evnt_multi()
  834.                                  liefert.
  835.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  836.                                  In exit wird ein Wert ungleich 0 zurückge-
  837.                                  geben, wenn das Modul seine Arbeit abbrechen
  838.                                  soll. Dieses sollte so schnell wie möglich
  839.                                  geschehen!                                 */
  840.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  841.                               /* Verarbeitet ein Zeitereignis, die Parameter
  842.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  843.                                  entsprechen den Werten die evnt_multi()
  844.                                  liefert.
  845.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  846.                                  In exit wird ein Wert ungleich 0 zurückge-
  847.                                  geben, wenn das Modul seine Arbeit abbrechen
  848.                                  soll. Dieses sollte so schnell wie möglich
  849.                                  geschehen!                                 */
  850.                               */
  851.     int    (*alert)           (int button, const char *astring);
  852.                               /* Die Funktion entspricht exakt form_alert().*/
  853.   } events;
  854.   struct {
  855.     void   (*reset_dialogCol) (int flag);
  856.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  857.                                  auf den ursprünglichen Wert zurück, nachdem
  858.                                  die Bildfarben gesichert wurden (flag = 1).
  859.                                  Restauriert die Bildfarben wieder, wenn
  860.                                  "flag" auf 0 gesetzt ist.
  861.                                  Die Funktion erlaubt einen verschachtelten
  862.                                  Aufruf und sollte vor und nach jedem Dialog
  863.                                  aufgerufen werden. Beachten Sie auch die
  864.                                  Richtlinie von ATARI "Abschließende Worte" */
  865.     void   (*send_windOpen)   (int wind_id);
  866.                               /* Meldet das Fenster mit der Identifikation
  867.                                  "wind_id" bei GEM-View an, damit es bei
  868.                                  der "Cycle Window"-Behandlung mitbehandelt
  869.                                  wird.
  870.                                  Das Fenster ist selbst zu öffnen.          */
  871.     void   (*send_windClosed) (int wind_id);
  872.                               /* Meldet das Fenster mit der Identifikation
  873.                                  "wind_id" bei GEM-View ab, damit es bei
  874.                                  der "Cycle Window"-Behandlung nun nicht
  875.                                  mehr mitarbeitet wird.
  876.                                  Das Fenster ist selbst zu öffnen.          */
  877.     void   (*send_windTop)    (int wind_id);
  878.                               /* Meldet das Fenster mit der Identifikation
  879.                                  "wind_id" bei GEM-View als "getopped",
  880.                                  damit die "Cycle Window"-Behandlung an-
  881.                                  gepaßt werden kann.                        */
  882.     void   (*send_windBottom) (int wind_id);
  883.                               /* Meldet das Fenster mit der Identifikation
  884.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  885.                                  grund-gebracht", damit die "Cycle Window"-
  886.                                  Behandlung angepaßt werden kann.           */
  887.   } diawin;
  888.   struct {
  889.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  890.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  891.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  892.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  893.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  894.   } versions;
  895.   struct {
  896.     unsigned IMG_fastload      :  1;
  897.     unsigned IMG_vdicolororder :  1;
  898.     unsigned IMG_TCalign16     :  1;
  899.     unsigned PCD_loadBase      :  3;
  900.     unsigned DSP_usingit       :  1;
  901.     unsigned DSP_greyscale     :  1;
  902.     unsigned UNUSED            :  8;
  903.     unsigned FUTUREUSED        : 16;
  904.     long     RESERVED;
  905.   } flags;
  906. } LOAD_Structure;
  907.  
  908.  
  909.  
  910.  
  911.  
  912. SAVE-Struktur (für die externen Speicher-Module von GEM-View3 *.GVS)
  913. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  914. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  915. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  916. Turbo C / Pure C. 
  917.  
  918. typedef struct SAVE_Structure {
  919.   long     identify;          /* GVWS_module  == 'GVWS' */
  920.   int      version;           /* GVWS_Version == 0x0100 */
  921.   Image   *image;             /* Zeiger auf "Image", das zu speichern ist.  */
  922.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  923.   char    *out_filename;      /* Dateiname, in der das Bild gespeichert wird*/
  924.   struct {
  925.     int    (*open)            (char *file);
  926.                               /* Öffnet die angegebene Datei, eine eventuell
  927.                                  vorhandene Datei wird überschrieben. Rück-
  928.                                  gabewert ist ein positives Dateihandle.
  929.                                  Im Fehlerfall wird ein negativer Wert
  930.                                  zurückgegeben                              */
  931.     ulong  (*write)           (int handle, ulong count, void *buf);
  932.                               /* Schreibt "count" Bytes aus dem Buffer "buf"
  933.                                  in die entsprechende Datei. Ein Puffer von
  934.                                  8 Kilobyte ist zwischengeschaltet.
  935.                                  Die Funktion liefert als Ergebnis die Anzahl
  936.                                  der gespeicherten Bytes zurück oder 0 im
  937.                                  Fehlerfall                                 */
  938.     int    (*close)           (int handle);
  939.                               /* Speichert gegebenenfalls den "internen"
  940.                                  Puffer ab und schließt die Datei.
  941.                                  Die Funktion liefert als Ergebnis eine 0,
  942.                                  wenn die Datei geschlossen werden konnte,
  943.                                  ansonsten eine negative Zahl.              */
  944.     int    (*delete)          (const char *fname);
  945.                               /* Löscht die die mit fname bezeichnete Datei.
  946.                                  Die Funktion liefert als Ergebnis eine 0,
  947.                                  wenn die Datei gelöscht werden konnte, und
  948.                                  ein von 0 verschiedenes Ergebnis, wenn die
  949.                                  Datei nicht gelöscht werden konnte.        */
  950.   } output;
  951.   struct {
  952.     int    (*printout)        (const char* format, ...);
  953.                               /* Schreibt eine Meldung in das Protokollfenster
  954.                                  von GEM-View. Die Aufrufstruktur und die
  955.                                  Parameter entsprechen "printf()" aus der
  956.                                  C-Standard-Library.
  957.                                  Folgende Sonderzeichen wurden verarbeitet:
  958.                                  "\001" : Positioniere eine Zeile nach oben
  959.                                  "\002" : Positioniere eine Spalte nach links
  960.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  961.                                  "\034\001": Schalte auf Fett-Schrift
  962.                                  "\034\010": Schalte Unterstreichung ein
  963.                                  "\034\011": Fett und Unterstreichung ein
  964.                                  "\034\100": Auf Normalschrift schalten     */
  965.   } print;
  966.   struct {
  967.     void   (*printerr)        (const char* format, ...);
  968.                               /* Wie "printout" (siehe oben). Zusätzlich:
  969.                                  - Der Text wird "Fett" ausgegeben.
  970.                                  - Ist das Protokollfenster geschlossen, wird
  971.                                    eine Alert-Box geöffnet.
  972.                                  - Ist das Protokollfenster auf "klein" ge-
  973.                                    schaltet, so wird das Fenster auf "groß"
  974.                                    geschaltet und in den Vordergrund gebracht
  975.                                  - Ist das Protokollfenster auf "groß" ge-
  976.                                    schaltet, so wird das Fenster in den
  977.                                    Vordergrund gebracht                     */
  978.     void   (*userexit)        (void);
  979.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  980.                                  tritt, kann die das Modul sofort verlassen
  981.                                  werden. Aller angeforderter Speicher wird
  982.                                  zurückgegeben. Allerdings sind vorher alle
  983.                                  VDI-Worstations zu schließen und alle
  984.                                  wind_updates() abzuschießen ...
  985.                                  Sollte nur im schlimmsten Fall (und nur
  986.                                  dann) verwendet werden.                    */
  987.   } error;
  988.   struct {
  989.     byte  *(*malloc)          (ulong size);
  990.                               /* Reserviert "size" Bytes dynamischen Speicher.
  991.                                  Die Funktion verwaltet selbsttätig kleine
  992.                                  Speicherblöcke in größeren "Clustern", um
  993.                                  die Speicherfragmentierunggefahr etwas zu
  994.                                  veringern. Verwenden Sie nur diese Funktion
  995.                                  um Speicher dynamisch anzufordern.         */
  996.     void   (*free)            (void *area);
  997.                               /* Gibt den reservierten Speicher wieder frei.*/
  998.   } memory;
  999.   struct {
  1000.     void   (*evntHandle)      (int wait);
  1001.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1002.                                  eine Nachricht entgegenzunehmen und sie dann
  1003.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1004.                                  keine Narchricht empfangen wird die Funktion
  1005.                                  wieder verlassen. Sehr praktisch um GEM-View
  1006.                                  ein paar Redraws und ähnliches machen zu
  1007.                                  lassen.                                    */
  1008.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1009.                               /* Verarbeitet ein Mausereignis, die Parameter
  1010.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1011.                                  den Werten, die evnt_multi() liefert.
  1012.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1013.                                  In exit wird ein Wert ungleich 0 zurückge-
  1014.                                  geben, wenn das Modul seine Arbeit abbrechen
  1015.                                  soll. Dieses sollte so schnell wie möglich
  1016.                                  geschehen!                                 */
  1017.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1018.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1019.                                  meter keystate, keypress entsprechen den
  1020.                                  Werten, die evnt_multi() liefert.
  1021.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1022.                                  In exit wird ein Wert ungleich 0 zurückge-
  1023.                                  geben, wenn das Modul seine Arbeit abbrechen
  1024.                                  soll. Dieses sollte so schnell wie möglich
  1025.                                  geschehen!                                 */
  1026.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1027.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1028.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1029.                                  keystate, keypress entsprechen den Werten,
  1030.                                  die evnt_multi() liefert.
  1031.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1032.                                  In exit wird ein Wert ungleich 0 zurückge-
  1033.                                  geben, wenn das Modul seine Arbeit abbrechen
  1034.                                  soll. Dieses sollte so schnell wie möglich
  1035.                                  geschehen!                                 */
  1036.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1037.                               /* Verarbeitet ein Messageereignis, die Para-
  1038.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1039.                                  entsprechen den Werten, die evnt_multi()
  1040.                                  liefert.
  1041.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1042.                                  In exit wird ein Wert ungleich 0 zurückge-
  1043.                                  geben, wenn das Modul seine Arbeit abbrechen
  1044.                                  soll. Dieses sollte so schnell wie möglich
  1045.                                  geschehen!                                 */
  1046.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1047.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1048.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1049.                                  entsprechen den Werten die evnt_multi()
  1050.                                  liefert.
  1051.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1052.                                  In exit wird ein Wert ungleich 0 zurückge-
  1053.                                  geben, wenn das Modul seine Arbeit abbrechen
  1054.                                  soll. Dieses sollte so schnell wie möglich
  1055.                                  geschehen!                                 */
  1056.                               */
  1057.     int    (*alert)           (int button, const char *astring);
  1058.                               /* Die Funktion entspricht exakt form_alert().*/
  1059.   } events;
  1060.   struct {
  1061.     void   (*reset_dialogCol) (int flag);
  1062.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1063.                                  auf den ursprünglichen Wert zurück, nachdem
  1064.                                  die Bildfarben gesichert wurden (flag = 1).
  1065.                                  Restauriert die Bildfarben wieder, wenn
  1066.                                  "flag" auf 0 gesetzt ist.
  1067.                                  Die Funktion erlaubt einen verschachtelten
  1068.                                  Aufruf und sollte vor und nach jedem Dialog
  1069.                                  aufgerufen werden. Beachten Sie auch die
  1070.                                  Richtlinie von ATARI "Abschließende Worte" */
  1071.     void   (*send_windOpen)   (int wind_id);
  1072.                               /* Meldet das Fenster mit der Identifikation
  1073.                                  "wind_id" bei GEM-View an, damit es bei
  1074.                                  der "Cycle Window"-Behandlung mitbehandelt
  1075.                                  wird.
  1076.                                  Das Fenster ist selbst zu öffnen.          */
  1077.     void   (*send_windClosed) (int wind_id);
  1078.                               /* Meldet das Fenster mit der Identifikation
  1079.                                  "wind_id" bei GEM-View ab, damit es bei
  1080.                                  der "Cycle Window"-Behandlung nun nicht
  1081.                                  mehr mitarbeitet wird.
  1082.                                  Das Fenster ist selbst zu öffnen.          */
  1083.     void   (*send_windTop)    (int wind_id);
  1084.                               /* Meldet das Fenster mit der Identifikation
  1085.                                  "wind_id" bei GEM-View als "getopped",
  1086.                                  damit die "Cycle Window"-Behandlung an-
  1087.                                  gepaßt werden kann.                        */
  1088.     void   (*send_windBottom) (int wind_id);
  1089.                               /* Meldet das Fenster mit der Identifikation
  1090.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1091.                                  grund-gebracht", damit die "Cycle Window"-
  1092.                                  Behandlung angepaßt werden kann.           */
  1093.   } diawin;
  1094.   struct {
  1095.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1096.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1097.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1098.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1099.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1100.   } versions;
  1101. } SAVE_Structure;
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107. PRINT-Struktur (für die externen Druck-Module von GEM-View3 *.GVP)
  1108. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  1109. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  1110. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  1111. Turbo C / Pure C. 
  1112.  
  1113. typedef struct PRINT_Structure {
  1114.   long     identify;          /* GVWP_module  == 'GVWP' */
  1115.   int      version;           /* GVWP_Version == 0x0100 */
  1116.   Image   *image;             /* Zeiger auf "Image", das zu bearbeiten ist. */
  1117.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  1118.   struct {
  1119.     int    (*open)            (char *file);
  1120.                               /* Öffnet die angegebene Datei, eine eventuell
  1121.                                  vorhandene Datei wird überschrieben.
  1122.                                  Für die paralelle Schnittstelle ist "PRN:"
  1123.                                  und für die serielle Schnittstelle ist "AUX:"
  1124.                                  zuverwenden.
  1125.                                  Rückgabewert ist ein positives Dateihandle.
  1126.                                  Im Fehlerfall wird ein negativer Wert
  1127.                                  zurückgegeben                              */
  1128.     ulong  (*write)           (int handle, ulong count, void *buf);
  1129.                               /* Schreibt "count" Bytes aus dem Buffer "buf"
  1130.                                  in die entsprechende Datei oder schickt die
  1131.                                  Daten zum Drucker. Ein Puffer von 8 Kilobyte
  1132.                                  ist zwischengeschaltet.
  1133.                                  Die Funktion liefert als Ergebnis die Anzahl
  1134.                                  der gespeicherten Bytes zurück oder 0 im
  1135.                                  Fehlerfall                                 */
  1136.     int    (*status)          (int handle);
  1137.                               /* Die Funktion überprüft, ob die Drucker-
  1138.                                  schnittstelle bereit ist, Zeichen anzunehmen.
  1139.                                  Die Funktion liefert als Ergebnis den
  1140.                                  Drucker-Status.
  1141.                                  Wenn der Drucker bereit ist, wird ein Wert
  1142.                                  ungleich 0 zurückgegeben, ansonsten eine 0.*/
  1143.     int    (*close)           (int handle);
  1144.                               /* Speichert bzw. druckt gegebenenfalls den
  1145.                                  Puffer ab und schließt die "Datei".
  1146.                                  Die Funktion liefert als Ergebnis eine 0,
  1147.                                  wenn die Datei geschlossen werden konnte,
  1148.                                  ansonsten eine negative Zahl.              */
  1149.   } output;
  1150.   struct {
  1151.     int    (*printout)        (const char* format, ...);
  1152.                               /* Schreibt eine Meldung in das Protokollfenster
  1153.                                  von GEM-View. Die Aufrufstruktur und die
  1154.                                  Parameter entsprechen "printf()" aus der
  1155.                                  C-Standard-Library.
  1156.                                  Folgende Sonderzeichen wurden verarbeitet:
  1157.                                  "\001" : Positioniere eine Zeile nach oben
  1158.                                  "\002" : Positioniere eine Spalte nach links
  1159.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  1160.                                  "\034\001": Schalte auf Fett-Schrift
  1161.                                  "\034\010": Schalte Unterstreichung ein
  1162.                                  "\034\011": Fett und Unterstreichung ein
  1163.                                  "\034\100": Auf Normalschrift schalten     */
  1164.   } print;
  1165.   struct {
  1166.     void   (*printerr)        (const char* format, ...);
  1167.                               /* Wie "printout" (siehe oben). Zusätzlich:
  1168.                                  - Der Text wird "Fett" ausgegeben.
  1169.                                  - Ist das Protokollfenster geschlossen, wird
  1170.                                    eine Alert-Box geöffnet.
  1171.                                  - Ist das Protokollfenster auf "klein" ge-
  1172.                                    schaltet, so wird das Fenster auf "groß"
  1173.                                    geschaltet und in den Vordergrund gebracht
  1174.                                  - Ist das Protokollfenster auf "groß" ge-
  1175.                                    schaltet, so wird das Fenster in den
  1176.                                    Vordergrund gebracht                     */
  1177.     void   (*userexit)        (void);
  1178.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  1179.                                  tritt, kann die das Modul sofort verlassen
  1180.                                  werden. Aller angeforderter Speicher wird
  1181.                                  zurückgegeben. Allerdings sind vorher alle
  1182.                                  VDI-Worstations zu schließen und alle
  1183.                                  wind_updates() abzuschießen ...
  1184.                                  Sollte nur im schlimmsten Fall (und nur
  1185.                                  dann) verwendet werden.                    */
  1186.   } error;
  1187.   struct {
  1188.     byte  *(*malloc)          (ulong size);
  1189.                               /* Reserviert "size" Bytes dynamischen Speicher.
  1190.                                  Die Funktion verwaltet selbsttätig kleine
  1191.                                  Speicherblöcke in größeren "Clustern", um
  1192.                                  die Speicherfragmentierunggefahr etwas zu
  1193.                                  veringern. Verwenden Sie nur diese Funktion
  1194.                                  um Speicher dynamisch anzufordern.         */
  1195.     void   (*free)            (void *area);
  1196.                               /* Gibt den reservierten Speicher wieder frei.*/
  1197.   } memory;
  1198.   struct {
  1199.     void   (*evntHandle)      (int wait);
  1200.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1201.                                  eine Nachricht entgegenzunehmen und sie dann
  1202.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1203.                                  keine Narchricht empfangen wird die Funktion
  1204.                                  wieder verlassen. Sehr praktisch um GEM-View
  1205.                                  ein paar Redraws und ähnliches machen zu
  1206.                                  lassen.                                    */
  1207.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1208.                               /* Verarbeitet ein Mausereignis, die Parameter
  1209.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1210.                                  den Werten, die evnt_multi() liefert.
  1211.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1212.                                  In exit wird ein Wert ungleich 0 zurückge-
  1213.                                  geben, wenn das Modul seine Arbeit abbrechen
  1214.                                  soll. Dieses sollte so schnell wie möglich
  1215.                                  geschehen!                                 */
  1216.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1217.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1218.                                  meter keystate, keypress entsprechen den
  1219.                                  Werten, die evnt_multi() liefert.
  1220.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1221.                                  In exit wird ein Wert ungleich 0 zurückge-
  1222.                                  geben, wenn das Modul seine Arbeit abbrechen
  1223.                                  soll. Dieses sollte so schnell wie möglich
  1224.                                  geschehen!                                 */
  1225.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1226.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1227.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1228.                                  keystate, keypress entsprechen den Werten,
  1229.                                  die evnt_multi() liefert.
  1230.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1231.                                  In exit wird ein Wert ungleich 0 zurückge-
  1232.                                  geben, wenn das Modul seine Arbeit abbrechen
  1233.                                  soll. Dieses sollte so schnell wie möglich
  1234.                                  geschehen!                                 */
  1235.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1236.                               /* Verarbeitet ein Messageereignis, die Para-
  1237.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1238.                                  entsprechen den Werten, die evnt_multi()
  1239.                                  liefert.
  1240.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1241.                                  In exit wird ein Wert ungleich 0 zurückge-
  1242.                                  geben, wenn das Modul seine Arbeit abbrechen
  1243.                                  soll. Dieses sollte so schnell wie möglich
  1244.                                  geschehen!                                 */
  1245.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1246.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1247.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1248.                                  entsprechen den Werten die evnt_multi()
  1249.                                  liefert.
  1250.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1251.                                  In exit wird ein Wert ungleich 0 zurückge-
  1252.                                  geben, wenn das Modul seine Arbeit abbrechen
  1253.                                  soll. Dieses sollte so schnell wie möglich
  1254.                                  geschehen!                                 */
  1255.                               */
  1256.     int    (*alert)           (int button, const char *astring);
  1257.                               /* Die Funktion entspricht exakt form_alert().*/
  1258.   } events;
  1259.   struct {
  1260.     void   (*reset_dialogCol) (int flag);
  1261.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1262.                                  auf den ursprünglichen Wert zurück, nachdem
  1263.                                  die Bildfarben gesichert wurden (flag = 1).
  1264.                                  Restauriert die Bildfarben wieder, wenn
  1265.                                  "flag" auf 0 gesetzt ist.
  1266.                                  Die Funktion erlaubt einen verschachtelten
  1267.                                  Aufruf und sollte vor und nach jedem Dialog
  1268.                                  aufgerufen werden. Beachten Sie auch die
  1269.                                  Richtlinie von ATARI "Abschließende Worte" */
  1270.     void   (*send_windOpen)   (int wind_id);
  1271.                               /* Meldet das Fenster mit der Identifikation
  1272.                                  "wind_id" bei GEM-View an, damit es bei
  1273.                                  der "Cycle Window"-Behandlung mitbehandelt
  1274.                                  wird.
  1275.                                  Das Fenster ist selbst zu öffnen.          */
  1276.     void   (*send_windClosed) (int wind_id);
  1277.                               /* Meldet das Fenster mit der Identifikation
  1278.                                  "wind_id" bei GEM-View ab, damit es bei
  1279.                                  der "Cycle Window"-Behandlung nun nicht
  1280.                                  mehr mitarbeitet wird.
  1281.                                  Das Fenster ist selbst zu öffnen.          */
  1282.     void   (*send_windTop)    (int wind_id);
  1283.                               /* Meldet das Fenster mit der Identifikation
  1284.                                  "wind_id" bei GEM-View als "getopped",
  1285.                                  damit die "Cycle Window"-Behandlung an-
  1286.                                  gepaßt werden kann.                        */
  1287.     void   (*send_windBottom) (int wind_id);
  1288.                               /* Meldet das Fenster mit der Identifikation
  1289.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1290.                                  grund-gebracht", damit die "Cycle Window"-
  1291.                                  Behandlung angepaßt werden kann.           */
  1292.   } diawin;
  1293.   struct {
  1294.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1295.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1296.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1297.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1298.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1299.   } versions;
  1300. } PRINT_Structure;
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306. PROC-Struktur (für die externen Bearbeitungs-Module von GEM-View3 *.GVR)
  1307. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  1308. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  1309. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  1310. Turbo C / Pure C. 
  1311.  
  1312. typedef struct PROC_Structure {
  1313.   long     identify;          /* GVWR_module  == 'GVWR' */
  1314.   int      version;           /* GVWR_Version == 0x0100 */
  1315.   Image   *image;             /* Zeiger auf "Image",das gedruckt werden soll*/
  1316.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  1317.   struct {
  1318.     int    (*printout)        (const char* format, ...);
  1319.                               /* Schreibt eine Meldung in das Protokollfenster
  1320.                                  von GEM-View. Die Aufrufstruktur und die
  1321.                                  Parameter entsprechen "printf()" aus der
  1322.                                  C-Standard-Library.
  1323.                                  Folgende Sonderzeichen wurden verarbeitet:
  1324.                                  "\001" : Positioniere eine Zeile nach oben
  1325.                                  "\002" : Positioniere eine Spalte nach links
  1326.                                  "\033E": Lösche Protokollfenster (CLR-HOME)
  1327.                                  "\034\001": Schalte auf Fett-Schrift
  1328.                                  "\034\010": Schalte Unterstreichung ein
  1329.                                  "\034\011": Fett und Unterstreichung ein
  1330.                                  "\034\100": Auf Normalschrift schalten     */
  1331.   } print;
  1332.   struct {
  1333.     void   (*printerr)        (const char* format, ...);
  1334.                               /* Wie "printout" (siehe oben). Zusätzlich:
  1335.                                  - Der Text wird "Fett" ausgegeben.
  1336.                                  - Ist das Protokollfenster geschlossen, wird
  1337.                                    eine Alert-Box geöffnet.
  1338.                                  - Ist das Protokollfenster auf "klein" ge-
  1339.                                    schaltet, so wird das Fenster auf "groß"
  1340.                                    geschaltet und in den Vordergrund gebracht
  1341.                                  - Ist das Protokollfenster auf "groß" ge-
  1342.                                    schaltet, so wird das Fenster in den
  1343.                                    Vordergrund gebracht                     */
  1344.     void   (*userexit)        (void);
  1345.                               /* Wenn in einem Modul ein fatalen Fehler auf-
  1346.                                  tritt, kann die das Modul sofort verlassen
  1347.                                  werden. Aller angeforderter Speicher wird
  1348.                                  zurückgegeben. Allerdings sind vorher alle
  1349.                                  VDI-Worstations zu schließen und alle
  1350.                                  wind_updates() abzuschießen ...
  1351.                                  Sollte nur im schlimmsten Fall (und nur
  1352.                                  dann) verwendet werden.                    */
  1353.   } error;
  1354.   struct {
  1355.     byte  *(*malloc)          (ulong size);
  1356.                               /* Reserviert "size" Bytes dynamischen Speicher.
  1357.                                  Die Funktion verwaltet selbsttätig kleine
  1358.                                  Speicherblöcke in größeren "Clustern", um
  1359.                                  die Speicherfragmentierunggefahr etwas zu
  1360.                                  veringern. Verwenden Sie nur diese Funktion
  1361.                                  um Speicher dynamisch anzufordern.         */
  1362.     void   (*free)            (void *area);
  1363.                               /* Gibt den reservierten Speicher wieder frei.*/
  1364.   } memory;
  1365.   struct {
  1366.     Image *(*newBitImage)     (char *title, unsigned int width, unsigned int height);
  1367.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1368.                                  Erzeugt und initialisiert eine "Image"-
  1369.                                  Struktur, wobei der Pfadname oder NULL über
  1370.                                  den Parameter "title" übergeben werden kann.
  1371.                                  Für den Datenbreich wird eine Bitplane mit
  1372.                                  alignwidth (auf 16 begradigtes "width") mal
  1373.                                  "height" reserviert.
  1374.                                  In "image->unalignwidth" wird "width" ein-
  1375.                                  getragen. "alignwidth" wird in "->width"
  1376.                                  eingetragen.
  1377.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1378.                                  gebaut und ist auch so wieder aufzubauen.  */
  1379.     Image *(*newRGBImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  1380.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1381.                                  Erzeugt und initialisiert eine "Image"-
  1382.                                  Struktur, wobei der Pfadname oder NULL über
  1383.                                  den Parameter "title" übergeben werden kann.
  1384.                                  Für den Datenbreich werden "depth" Bitplanes
  1385.                                  mit alignwidth (auf 16 begradigtes "width")
  1386.                                  mal "height" reserviert. Zur Aufnahme des
  1387.                                  GEM-Standard-Formats.
  1388.                                  In "image->unalignwidth" wird "width" ein-
  1389.                                  getragen. "alignwidth" wird in "->width"
  1390.                                  eingetragen.
  1391.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1392.                                  gebaut und ist auch so wieder aufzubauen.  */
  1393.     Image *(*newTCImage)      (char *title, unsigned int width, unsigned int height);
  1394.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1395.                                  Erzeugt und initialisiert eine "Image"-
  1396.                                  Struktur, wobei der Pfadname oder NULL über
  1397.                                  den Parameter "title" übergeben werden kann.
  1398.                                  Für den Datenbreich werden alignwidth (auf
  1399.                                  16 begradigtes "width") mal "height" viele
  1400.                                  RGB-Tripel reserviert.
  1401.                                  In "image->unalignwidth" wird "width" ein-
  1402.                                  getragen. "alignwidth" wird in "->width"
  1403.                                  eingetragen.
  1404.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1405.                                  gebaut und ist auch so wieder aufzubauen.  */
  1406.     Image *(*newGEMImage)     (char *title, unsigned int width, unsigned int height, unsigned int depth);
  1407.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1408.                                  Erzeugt und initialisiert eine "Image"-
  1409.                                  Struktur, wobei der Pfadname oder NULL über
  1410.                                  den Parameter "title" übergeben werden kann.
  1411.                                  Für den Datenbreich werden "depth" Bitplanes
  1412.                                  mit alignwidth (auf 16 begradigtes "width")
  1413.                                  mal "height" reserviert. Zur Aufnahme des
  1414.                                  GEM-Standard-Formats.
  1415.                                  In "image->unalignwidth" wird "width" ein-
  1416.                                  getragen. "alignwidth" wird in "->width"
  1417.                                  eingetragen.
  1418.                                  Das Bild ist IMMER auf Worte begradigt auf-
  1419.                                  gebaut und ist auch so wieder aufzubauen.  */
  1420.     void   (*freeGVImage)     (Image *image);
  1421.                               /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
  1422.                                  Gibt die reservierten Strukturen wieder frei,
  1423.                                  wenn zum Beispiel während der Umwandlung
  1424.                                  etwas unvorhergesehenes passiert.
  1425.                                  Das Bild, welches dem Bearbeitungsmodul
  1426.                                  übergeben wird von GEM-View aus dem Speicher
  1427.                                  entfernt und darf nicht vom Modul gelöscht
  1428.                                  werden.                                    */
  1429.   } images;
  1430.   struct {
  1431.     void   (*evntHandle)      (int wait);
  1432.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1433.                                  eine Nachricht entgegenzunehmen und sie dann
  1434.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1435.                                  keine Narchricht empfangen wird die Funktion
  1436.                                  wieder verlassen. Sehr praktisch um GEM-View
  1437.                                  ein paar Redraws und ähnliches machen zu
  1438.                                  lassen.                                    */
  1439.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1440.                               /* Verarbeitet ein Mausereignis, die Parameter
  1441.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1442.                                  den Werten, die evnt_multi() liefert.
  1443.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1444.                                  In exit wird ein Wert ungleich 0 zurückge-
  1445.                                  geben, wenn das Modul seine Arbeit abbrechen
  1446.                                  soll. Dieses sollte so schnell wie möglich
  1447.                                  geschehen!                                 */
  1448.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1449.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1450.                                  meter keystate, keypress entsprechen den
  1451.                                  Werten, die evnt_multi() liefert.
  1452.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1453.                                  In exit wird ein Wert ungleich 0 zurückge-
  1454.                                  geben, wenn das Modul seine Arbeit abbrechen
  1455.                                  soll. Dieses sollte so schnell wie möglich
  1456.                                  geschehen!                                 */
  1457.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1458.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1459.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1460.                                  keystate, keypress entsprechen den Werten,
  1461.                                  die evnt_multi() liefert.
  1462.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1463.                                  In exit wird ein Wert ungleich 0 zurückge-
  1464.                                  geben, wenn das Modul seine Arbeit abbrechen
  1465.                                  soll. Dieses sollte so schnell wie möglich
  1466.                                  geschehen!                                 */
  1467.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1468.                               /* Verarbeitet ein Messageereignis, die Para-
  1469.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1470.                                  entsprechen den Werten, die evnt_multi()
  1471.                                  liefert.
  1472.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1473.                                  In exit wird ein Wert ungleich 0 zurückge-
  1474.                                  geben, wenn das Modul seine Arbeit abbrechen
  1475.                                  soll. Dieses sollte so schnell wie möglich
  1476.                                  geschehen!                                 */
  1477.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1478.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1479.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1480.                                  entsprechen den Werten die evnt_multi()
  1481.                                  liefert.
  1482.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1483.                                  In exit wird ein Wert ungleich 0 zurückge-
  1484.                                  geben, wenn das Modul seine Arbeit abbrechen
  1485.                                  soll. Dieses sollte so schnell wie möglich
  1486.                                  geschehen!                                 */
  1487.                               */
  1488.     int    (*alert)           (int button, const char *astring);
  1489.                               /* Die Funktion entspricht exakt form_alert().*/
  1490.   } events;
  1491.   struct {
  1492.     void   (*reset_dialogCol) (int flag);
  1493.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1494.                                  auf den ursprünglichen Wert zurück, nachdem
  1495.                                  die Bildfarben gesichert wurden (flag = 1).
  1496.                                  Restauriert die Bildfarben wieder, wenn
  1497.                                  "flag" auf 0 gesetzt ist.
  1498.                                  Die Funktion erlaubt einen verschachtelten
  1499.                                  Aufruf und sollte vor und nach jedem Dialog
  1500.                                  aufgerufen werden. Beachten Sie auch die
  1501.                                  Richtlinie von ATARI "Abschließende Worte" */
  1502.     void   (*send_windOpen)   (int wind_id);
  1503.                               /* Meldet das Fenster mit der Identifikation
  1504.                                  "wind_id" bei GEM-View an, damit es bei
  1505.                                  der "Cycle Window"-Behandlung mitbehandelt
  1506.                                  wird.
  1507.                                  Das Fenster ist selbst zu öffnen.          */
  1508.     void   (*send_windClosed) (int wind_id);
  1509.                               /* Meldet das Fenster mit der Identifikation
  1510.                                  "wind_id" bei GEM-View ab, damit es bei
  1511.                                  der "Cycle Window"-Behandlung nun nicht
  1512.                                  mehr mitarbeitet wird.
  1513.                                  Das Fenster ist selbst zu öffnen.          */
  1514.     void   (*send_windTop)    (int wind_id);
  1515.                               /* Meldet das Fenster mit der Identifikation
  1516.                                  "wind_id" bei GEM-View als "getopped",
  1517.                                  damit die "Cycle Window"-Behandlung an-
  1518.                                  gepaßt werden kann.                        */
  1519.     void   (*send_windBottom) (int wind_id);
  1520.                               /* Meldet das Fenster mit der Identifikation
  1521.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1522.                                  grund-gebracht", damit die "Cycle Window"-
  1523.                                  Behandlung angepaßt werden kann.           */
  1524.   } diawin;
  1525.   struct {
  1526.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1527.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1528.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1529.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1530.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1531.   } versions;
  1532. } PROC_Structure;
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538. CONV-Struktur (für das externe Konvertierungs-Module von GEM-View3)
  1539. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  1540. Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
  1541. Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
  1542. Turbo C / Pure C. 
  1543.  
  1544. typedef struct CONV_Structure {
  1545.   long     identify;          /* GVWC_module  == 'GVWC' */
  1546.   int      version;           /* GVWC_Version == 0x0100 */
  1547.   int      screen_depth;      /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
  1548.   struct {
  1549.     byte  *(*malloc)          (ulong size);
  1550.                               /* Reserviert "size" Bytes dynamischen Speicher.
  1551.                                  Die Funktion verwaltet selbsttätig kleine
  1552.                                  Speicherblöcke in größeren "Clustern", um
  1553.                                  die Speicherfragmentierunggefahr etwas zu
  1554.                                  veringern. Verwenden Sie nur diese Funktion
  1555.                                  um Speicher dynamisch anzufordern.         */
  1556.     void   (*free)            (void *area);
  1557.                               /* Gibt den reservierten Speicher wieder frei.*/
  1558.   } memory;
  1559.   struct {
  1560.     void   (*evntHandle)      (int wait);
  1561.                               /* Läßt GEM-View "wait" Millisekunden Zeit um
  1562.                                  eine Nachricht entgegenzunehmen und sie dann
  1563.                                  abzuarbeiten. Wird nach "wait" Millisekunden
  1564.                                  keine Narchricht empfangen wird die Funktion
  1565.                                  wieder verlassen. Sehr praktisch um GEM-View
  1566.                                  ein paar Redraws und ähnliches machen zu
  1567.                                  lassen.                                    */
  1568.     void   (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1569.                               /* Verarbeitet ein Mausereignis, die Parameter
  1570.                                  ev_mx, ev_my, keystate, keypress entsprechen
  1571.                                  den Werten, die evnt_multi() liefert.
  1572.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1573.                                  In exit wird ein Wert ungleich 0 zurückge-
  1574.                                  geben, wenn das Modul seine Arbeit abbrechen
  1575.                                  soll. Dieses sollte so schnell wie möglich
  1576.                                  geschehen!                                 */
  1577.     void   (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
  1578.                               /* Verarbeitet ein Tastaturereignis, die Para-
  1579.                                  meter keystate, keypress entsprechen den
  1580.                                  Werten, die evnt_multi() liefert.
  1581.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1582.                                  In exit wird ein Wert ungleich 0 zurückge-
  1583.                                  geben, wenn das Modul seine Arbeit abbrechen
  1584.                                  soll. Dieses sollte so schnell wie möglich
  1585.                                  geschehen!                                 */
  1586.     void   (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
  1587.                               /* Verarbeitet ein Mausknopfereignis, die Para-
  1588.                                  meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
  1589.                                  keystate, keypress entsprechen den Werten,
  1590.                                  die evnt_multi() liefert.
  1591.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1592.                                  In exit wird ein Wert ungleich 0 zurückge-
  1593.                                  geben, wenn das Modul seine Arbeit abbrechen
  1594.                                  soll. Dieses sollte so schnell wie möglich
  1595.                                  geschehen!                                 */
  1596.     void   (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
  1597.                               /* Verarbeitet ein Messageereignis, die Para-
  1598.                                  meter msg, ev_mx, ev_my, keystate, keypress
  1599.                                  entsprechen den Werten, die evnt_multi()
  1600.                                  liefert.
  1601.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1602.                                  In exit wird ein Wert ungleich 0 zurückge-
  1603.                                  geben, wenn das Modul seine Arbeit abbrechen
  1604.                                  soll. Dieses sollte so schnell wie möglich
  1605.                                  geschehen!                                 */
  1606.     void   (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
  1607.                               /* Verarbeitet ein Zeitereignis, die Parameter
  1608.                                  ev_mx, ev_my, keystate, keypress, ev_mbutton
  1609.                                  entsprechen den Werten die evnt_multi()
  1610.                                  liefert.
  1611.                                  gvwInAction ist immer auf TRUE (1) zu setzen
  1612.                                  In exit wird ein Wert ungleich 0 zurückge-
  1613.                                  geben, wenn das Modul seine Arbeit abbrechen
  1614.                                  soll. Dieses sollte so schnell wie möglich
  1615.                                  geschehen!                                 */
  1616.                               */
  1617.     int    (*alert)           (int button, const char *astring);
  1618.                               /* Die Funktion entspricht exakt form_alert().*/
  1619.   } events;
  1620.   struct {
  1621.     void   (*reset_dialogCol) (int flag);
  1622.                               /* Setzt die Desktopfarben (0 bis 15) wieder
  1623.                                  auf den ursprünglichen Wert zurück, nachdem
  1624.                                  die Bildfarben gesichert wurden (flag = 1).
  1625.                                  Restauriert die Bildfarben wieder, wenn
  1626.                                  "flag" auf 0 gesetzt ist.
  1627.                                  Die Funktion erlaubt einen verschachtelten
  1628.                                  Aufruf und sollte vor und nach jedem Dialog
  1629.                                  aufgerufen werden. Beachten Sie auch die
  1630.                                  Richtlinie von ATARI "Abschließende Worte" */
  1631.     void   (*send_windOpen)   (int wind_id);
  1632.                               /* Meldet das Fenster mit der Identifikation
  1633.                                  "wind_id" bei GEM-View an, damit es bei
  1634.                                  der "Cycle Window"-Behandlung mitbehandelt
  1635.                                  wird.
  1636.                                  Das Fenster ist selbst zu öffnen.          */
  1637.     void   (*send_windClosed) (int wind_id);
  1638.                               /* Meldet das Fenster mit der Identifikation
  1639.                                  "wind_id" bei GEM-View ab, damit es bei
  1640.                                  der "Cycle Window"-Behandlung nun nicht
  1641.                                  mehr mitarbeitet wird.
  1642.                                  Das Fenster ist selbst zu öffnen.          */
  1643.     void   (*send_windTop)    (int wind_id);
  1644.                               /* Meldet das Fenster mit der Identifikation
  1645.                                  "wind_id" bei GEM-View als "getopped",
  1646.                                  damit die "Cycle Window"-Behandlung an-
  1647.                                  gepaßt werden kann.                        */
  1648.     void   (*send_windBottom) (int wind_id);
  1649.                               /* Meldet das Fenster mit der Identifikation
  1650.                                  "wind_id" bei GEM-View als "in-den-Hinter-
  1651.                                  grund-gebracht", damit die "Cycle Window"-
  1652.                                  Behandlung angepaßt werden kann.           */
  1653.     int    (*getMSaving)      (char *title, char *extention, char *name, char *filename);
  1654.                               /* Führt einen Benutzerdialog zur Auswahl eines
  1655.                                  monochromen Speicherformats.
  1656.                                  Der Text "title" wird im Dialog eingetragen.
  1657.                                  In "extention" wird die übliche Dateiendung
  1658.                                  (6 Bytes), in "name" der Name des Formates
  1659.                                  (18 Bytes) und in "filename" der Modulname
  1660.                                  (14 Bytes) zurückgebenen. Als Funktionswert
  1661.                                  erhält man einen Wert ungleich 0, wenn die
  1662.                                  Werte gültig sind, ansonsten 0.            */
  1663.     int    (*getCSaving)      (char *title, char *extention, char *name, char *filename);
  1664.                               /* Führt einen Benutzerdialog zur Auswahl eines
  1665.                                  farbigen Speicherformats.
  1666.                                  Der Text "title" wird im Dialog eingetragen.
  1667.                                  In "extention" wird die übliche Dateiendung
  1668.                                  (6 Bytes), in "name" der Name des Formates
  1669.                                  (18 Bytes) und in "filename" der Modulname
  1670.                                  (14 Bytes) zurückgebenen. Als Funktionswert
  1671.                                  erhält man einen Wert ungleich 0, wenn die
  1672.                                  Werte gültig sind, ansonsten 0.            */
  1673.     int    (*getTSaving)      (char *title, char *extention, char *name, char *filename);
  1674.                               /* Führt einen Benutzerdialog zur Auswahl eines
  1675.                                  True-Color Speicherformats.
  1676.                                  Der Text "title" wird im Dialog eingetragen.
  1677.                                  In "extention" wird die übliche Dateiendung
  1678.                                  (6 Bytes), in "name" der Name des Formates
  1679.                                  (18 Bytes) und in "filename" der Modulname
  1680.                                  (14 Bytes) zurückgebenen. Als Funktionswert
  1681.                                  erhält man einen Wert ungleich 0, wenn die
  1682.                                  Werte gültig sind, ansonsten 0.            */
  1683.   } diawin;
  1684.   struct {
  1685.     int    applicationID;     /* Enthält die appl_id von appl_init()        */
  1686.     int    gemview_vers;      /* Enthält die GEM-View Version 0x0300 (3.00) */
  1687.     int    tos_version;       /* Enthält die TOS Versionsnummer z.B. 0x0404 */
  1688.     int    aes_version;       /* Enthält die AES Versionsnummer z.B. 0x0340 */
  1689.     int    multi_task;        /* Enthält den Wert aus GemParBlk.global[1]   */
  1690.   } versions;
  1691. } CONV_Structure;
  1692.  
  1693.  
  1694.  
  1695.  
  1696.  
  1697. Entwickler-Support
  1698. """"""""""""""""""
  1699. Bei Fragen zur Modulprogrammierung kann ich am Samstags zwischen
  1700. 14:00 und 16:00 Uhr angerufen werden.
  1701. Dies gilt ausschließlich für Fragen zur Modulprogrammierung, quasi
  1702. ein Entwickler-Support ;-)
  1703.